home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / comm / xeno / bbbbscd.lha / BBBBScd / System / s / bbsExtDL.cache < prev    next >
Text File  |  1995-03-18  |  22KB  |  846 lines

  1. /* Based on: bbsExtDL.cache 8.2 (17.10.94) copyright 1992-94 Richard Stockton
  2.                          FREELY DISTRIBUTABLE
  3.  
  4. ****************************************************************************
  5. CONVERTED FOR XENOLINK PRO BBS. $VERS:1.0 (18.03.95) by Derek Scott,2:259/75
  6. ****************************************************************************
  7.  
  8. Allows Xenolink sysop to cache a whole CD volume (or assign) from the shell,
  9. for use with BBBBScd Xeno door.
  10.  
  11. Just ignores file or directory names that contain spaces because Xenolink
  12. would be unable to download them anyway. (But handles recursive files &
  13. directories OK, archived by LZX by use of 'SELECT ALL' parameter)
  14.  
  15. Ignores icons (files that end in .info).
  16.  
  17. A textfile  CD_Exclude , controls exclusion of drawers on certain CDs that
  18. contain copyright files. Other specific files or directories can be excluded
  19. by adding their paths to the CD_Exclude textfile, one path per line.
  20. */
  21.  
  22.  
  23.  OPTIONS RESULTS  /*sets internal default to request RESULTS string from host*/
  24.  FF='0C'x         /* defines hex-decimal value for FORM FEED (clear screen)*/
  25.  CR='0D'x         /* defines hex-decimal value for CARRIAGE RETURN*/
  26.  
  27. SIGNAL ON BREAK_C
  28. SIGNAL ON BREAK_E
  29. SIGNAL ON ERROR
  30.  
  31. PARSE ARG volume wannasee askcache
  32. IF volume='' THEN EXIT
  33. IF wannasee~='' THEN wannasee=UPPER(LEFT(wannasee,1))
  34. IF askcache~='' THEN askcache=UPPER(LEFT(askcache,1))
  35.  
  36. cfgfile='xconfig:BBBBScd.config'
  37.  
  38.  
  39.  
  40.  /* Open the support library if it is not already open.  (yawn...)*/
  41.  
  42.  if ~show('L',"rexxsupport.library") THEN
  43.    DO
  44.     addlib('rexxsupport.library',0,-30,0)
  45.    END
  46.  
  47.  if ~show('L',"rexxmathlib.library") THEN
  48.    DO
  49.     addlib('rexxmathlib.library',0,-30,0)
  50.    END
  51. SAY ' '
  52.  
  53.  if ~show('L',"rexxarplib.library") THEN
  54.    DO
  55.     addlib('rexxarplib.library',0,-30,0)
  56.    END
  57.  
  58. IF ~SHOW('P','QuickSortPort') THEN 
  59. DO
  60.   /*  Add the QuickSort port, so we can use QSORT.
  61.    *   First check if the port is already up. If not, run QuickSort
  62.    *   and wait for the port to be there  */
  63.   if ~showlist('p','QuickSortPort') then
  64.   do
  65.     ADDRESS COMMAND "run quicksort >NIL:"
  66.     do i = 1 to 10
  67.       if ~showlist('p','QuickSortPort') then call delay 20
  68.       else leave i
  69.     end
  70.     if showlist('p','QuickSortPort') then call addlib('QuickSortPort',-30)   
  71.   end
  72. end
  73. IF ~SHOW('P','QuickSortPort') THEN EXIT 666
  74.  
  75.  
  76. /* read the configuration parameters from XCONFIG:BBBBScd.CFG */
  77. x=OPEN(f,cfgfile,'R')
  78. IF x~=0 THEN 
  79.   DO
  80.     bbspath=READLN(f)
  81.     devlist=READLN(f)
  82.     sysoplevel=VALUE(WORD(READLN(f),1))
  83.     junk=READLN(f)
  84.     junk=READLN(f)
  85.     xrecursive_size=VALUE(WORD(READLN(f),1))
  86.     junk=READLN(f)
  87.     lzxflag=READLN(f)
  88.     CALL CLOSE(f)
  89.   END
  90. ELSE
  91.   /* can't open config file, so use defaults... :) */
  92.   DO
  93.     bbspath='doors:bbbbsCD/'
  94.     devlist='CD0: CD1: CD2: CD50: CD51: CD52: CD53: CD54: CD55: CD56:'
  95.     sysoplevel=224 
  96.     lzxflag='N'
  97.   END
  98. /***************************************************************************/
  99.  
  100. /* set additional parameters about user, passed by Xenolink node */
  101. level=255
  102. maxtime=10000
  103. linesperpage=24
  104. menuset=1
  105. nodex=0
  106. namex='SYSOP'
  107. name='SYSOP'
  108. colorflag=1
  109. node=nodex
  110.  
  111.  
  112. /* Call Newline to List all Dirs on device */
  113. sizefile='RAM:bbsCDsize'nodex
  114. SAY 'Collecting dirs on 'volume' ... please be patient! ;)'
  115. ADDRESS COMMAND 'c:nl >'sizefile' 'volume' -Z -W -F'
  116. ADDRESS COMMAND 'c:WAIT 5'
  117. okflag=0
  118. fsize=0
  119. DO zloop=1
  120.   zz=OPEN(f10,sizefile,'r')
  121.   IF zz~=0 THEN LEAVE zloop
  122.   DO
  123.     SAY 'Still waiting for list of directories...'
  124.     ADDRESS COMMAND 'c:WAIT 5'
  125.     ITERATE zloop
  126.   END
  127. END
  128. zzrecflag=0
  129. zzpos=0
  130. zzcount=0
  131. zzpath=''
  132.  
  133.  
  134.  
  135. exclude=''
  136. x=OPEN(f,bbspath'CD_Exclude','R')
  137. IF x~=0 THEN exclude=READCH(f,65000)
  138. CALL CLOSE(f)
  139. exclude=UPPER(TRANSLATE(exclude,' ','0A'x))
  140.  
  141. lists.=''
  142. lists.0=0
  143. maxtime=maxtime-30
  144. CALL TIME('R')
  145. CR='0D'x
  146. def=''
  147. pen3=''
  148. IF colorflag<1 THEN
  149.   DO
  150.     def=''
  151.     pen3=''
  152.   END
  153. ELSE colorflag=1
  154.  
  155.  
  156. saytxt=FF
  157. SAY saytxt
  158.  
  159. selected=''
  160. path=''
  161. templist=devlist
  162. devlist=''
  163. longest=0
  164. CALL PRAGMA('W','N')  /* disk requesters OFF */
  165. CALL PRAGMA('D',bbspath'Information')
  166. test3=PRAGMA('D')
  167. DO i=1 TO WORDS(templist)
  168.   test=WORD(templist,i)
  169.   IF ~EXISTS(test) THEN ITERATE i
  170.   IF SHOWLIST('A',UPPER(LEFT(test,LENGTH(test)-1))) THEN test2=test
  171.   ELSE
  172.     DO
  173.       CALL PRAGMA('D',test)
  174.       test2=PRAGMA('D')
  175. /************************************************************/
  176. /* DAS - Fool System into thinking Assigns are REAL Devices */
  177.       IF test2='d::' THEN test2='Pro_CD1:'
  178. /* DAS */
  179. /************************************************************/
  180.       IF test2=test3 THEN ITERATE i
  181.       IF WORDS(test2)>1 THEN test2=test
  182.     END
  183.   devlist=STRIP(devlist test2)
  184.   IF LENGTH(test2)>longest THEN longest=LENGTH(test2)
  185. END
  186. cols=76%(longest+8)
  187. IF devlist='' THEN
  188.   DO
  189.     SAY
  190.     saytxt='*** Sorry, no External Devices are available! ***'CR
  191.     SAY saytxt
  192.     SAY
  193.     OPTIONS PROMPT  'Press RETURN'
  194.     PULL junk
  195.     EXIT('')
  196.   END
  197.  
  198. picklist=devlist
  199. IF WORDS(picklist)=1 THEN
  200.   DO
  201.     path=picklist
  202.     IF RIGHT(path,1)~=':' THEN path=path'/'
  203.     picklist=makepicklist()
  204.   END
  205. ELSE
  206.   DO
  207.     lists.0=1
  208.     dirs=WORDS(devlist)
  209.   END
  210.  
  211. OPTIONS PROMPT  'Press RETURN'
  212. PULL junk
  213.  
  214. DO loop=1
  215.   test=TIME('E')
  216.   IF test>(maxtime-100) THEN
  217.     DO
  218.       SAY
  219.       IF test>maxtime THEN
  220.         DO
  221.           saytxt='*** This session''s time is expiring! ***'CR
  222.           SAY saytxt
  223.           SAY
  224.           LEAVE loop
  225.         END
  226.       ELSE SAY '*** Less than 2 minutes remaining! ***'
  227.       SAY CR
  228.     END
  229.   filename=pick(picklist)
  230.   IF filename='' THEN
  231.     DO
  232.       temp=path
  233.       IF RIGHT(temp,1)='/' THEN temp=LEFT(temp,LENGTH(temp)-1)
  234.       IF FIND(UPPER(devlist),UPPER(temp))>0 THEN
  235.         DO
  236.           IF WORDS(devlist)=1 THEN ITERATE loop
  237.           picklist=devlist
  238.           path=''
  239.           ITERATE loop
  240.         END
  241.       ELSE
  242.         DO
  243.           test=RIGHT(path,1)
  244.           IF test='/' THEN path=LEFT(path,LENGTH(path)-1)
  245.           slash=LASTPOS('/',path)
  246.           IF slash=0 THEN slash=LASTPOS(':',path)
  247.           path=LEFT(path,slash)
  248.         END
  249.     END
  250.   IF filename=':-)' THEN ITERATE loop
  251.   tempath=path||filename
  252.   temp=WORD(STATEF(tempath),1)
  253.   IF temp='FILE' THEN
  254.     DO
  255.       IF FIND(UPPER(selected),UPPER(tempath))=0 THEN
  256.         selected=selected tempath
  257.       ELSE selected=DELWORD(selected,FIND(UPPER(selected),UPPER(tempath)),1)
  258.       shosel=''
  259.       ITERATE loop
  260.     END
  261.   ELSE IF temp='DIR' THEN
  262.     DO
  263.       path=tempath
  264.       test=RIGHT(path,1)
  265.       IF test~='' & test~='/' & test~=':' THEN path=path'/'
  266.     END
  267.   ELSE IF UPPER(filename)='DONE' THEN LEAVE loop
  268.   IF path~='' THEN picklist=makepicklist()
  269. END
  270. selected=STRIP(selected)
  271. test=''
  272. CALL CLOSE(f10)
  273. SAY 'Returning to the BBS...'
  274. SAY 
  275. EXIT
  276.  
  277.  
  278. makepicklist:
  279. IF path='' THEN RETURN ''
  280. IF STORAGE()<100000 THEN
  281.   DO
  282.     lists.=''
  283.     lists.0=0
  284.     IF WORDS(devlist)>1 THEN
  285.       DO
  286.         lists.0=1
  287.         lists.1.0=devlist
  288.       END
  289.   END
  290. DO i=1 TO lists.0
  291.   IF path=lists.i THEN RETURN lists.i.0
  292. END
  293. cname=STRIP(RIGHT(COMPRESS(path,' ._-:/'),29))
  294. IF cname~='' & EXISTS(bbspath'Cache/'cname) THEN
  295.   DO cloop=1 TO 1
  296.     k=lists.0+1
  297.     lists.0=k
  298.     x=OPEN(f,bbspath'Cache/'cname'.','R')
  299.     IF x=0 THEN SAY bbspath'Cache/'cname'. failed to open!'
  300.     ELSE
  301.       DO
  302.         cpath=READLN(f)
  303.         IF cpath=path THEN lists.k=path
  304.         ELSE
  305.           DO
  306.             IF level>sysoplevel THEN
  307.               SAY path 'does not match cache path in' cname'. !'
  308.             CALL CLOSE(f)
  309.             lists.0=lists.0-1
  310.             LEAVE cloop
  311.           END
  312.         DO i=1
  313.           line=READLN(f)
  314.           IF EOF(f) THEN LEAVE i
  315.           IF colorflag~=1 THEN
  316.             DO
  317.               n=POS('1B'x,line)
  318.               DO WHILE n>0
  319.                 DO m=2
  320.                   IF DATATYPE(SUBSTR(line,n+m,1),'M') | (n+m+1)>LENGTH(line) THEN
  321.                     leave m
  322.                 END
  323.                 line=DELSTR(line,n,m+1)
  324.                 n=POS('1B'x,line)
  325.               END
  326.             END
  327.           lists.k.i=line
  328.         END
  329.         CALL CLOSE(f)
  330.         lists.k.ROWS=i-1
  331.       END
  332.     x=OPEN(f,bbspath'Cache/'cname,'R')
  333.     IF x=0 THEN
  334.       DO
  335.         SAY bbspath'Cache/cname failed to open!'CR
  336.         CALL CLOSE(f)
  337.         lists.0=lists.0-1
  338.         LEAVE cloop
  339.       END
  340.     ELSE
  341.       DO
  342.         plist=READCH(f,65000)
  343.         CALL CLOSE(f)
  344.         lists.k.0=plist
  345.         RETURN plist
  346.       END
  347.   END
  348. SAY 'Loading...'CR
  349. CALL FileList(path'*',filelist,'F','N')
  350. IF filelist.0>1 THEN CALL QSORT(1,filelist.0,filelist)
  351. CALL FileList(path'*',dirlist,'D','N')
  352. IF dirlist.0>1 THEN CALL QSORT(1,dirlist.0,dirlist)
  353. plist=''
  354. dirs=0
  355. longest=0
  356. DO i=1 TO filelist.0
  357.   IF WORDS(filelist.i)~=1 THEN ITERATE i
  358.   IF filelist.i='' THEN ITERATE i
  359.   IF UPPER(RIGHT(filelist.i,5))='.INFO' THEN ITERATE i
  360.   IF FIND(exclude,UPPER(path||filelist.i))>0 THEN ITERATE i
  361.   plist=STRIP(plist filelist.i)
  362.   IF LENGTH(filelist.i)>longest THEN longest=LENGTH(filelist.i)
  363. END
  364. DO i=1 TO dirlist.0
  365.   IF WORDS(dirlist.i)~=1 THEN ITERATE i
  366.   IF FIND(exclude,UPPER(path||dirlist.i))>0 THEN ITERATE i
  367.   plist=STRIP(plist dirlist.i)
  368.   IF LENGTH(dirlist.i)>longest THEN longest=LENGTH(dirlist.i)
  369.   dirs=dirs+1
  370. END
  371. cols=76%(longest+9)
  372. lists.0=lists.0+1
  373. i=lists.0
  374. lists.i=path
  375. lists.i.0=plist
  376. DROP filelist. dirlist. 
  377. RETURN plist
  378.  
  379.  
  380. pick:
  381. PARSE ARG list 
  382. selection=''
  383. DO k=1 TO lists.0
  384.   IF path=lists.k THEN LEAVE k
  385. END
  386. IF ~DATATYPE(lists.k.ROWS,'N') THEN
  387.   DO
  388.     items=WORDS(list)
  389.     IF items<75 & dirs<25 THEN SAY 'Formatting' items 'items...'
  390.     ELSE SAY 'Please be patient, formatting' items 'items may take a while the first time...'
  391.     lists.k.ROWS=(items%cols)+((items//cols)>0)
  392.     IF cols>items THEN cols=items
  393.     IF cols<1 THEN cols=1
  394.     longest=(76%cols)-8
  395.     lists.k=path
  396.     DO j=0 TO cols-1
  397.       DO i=1 TO lists.k.ROWS
  398.         thisnum=j*lists.k.ROWS+i
  399.         IF thisnum<=items THEN
  400.           DO
  401.             thisitem=WORD(list,thisnum)
  402.             filestat=STATEF(path||thisitem)
  403.             thisitem=LEFT(thisitem,longest)' '
  404.             IF WORD(filestat,1)='DIR' THEN
  405.               lists.k.i=lists.k.i||pen3'(dir) 'thisitem||def
  406.             ELSE
  407.               DO
  408.                 bytes=WORD(filestat,2)
  409.                 IF bytes<10000 THEN 
  410.                   lists.k.i=lists.k.i||RIGHT(bytes,5) thisitem
  411.                 ELSE IF bytes>1023999 THEN 
  412.                   lists.k.i=lists.k.i||RIGHT(bytes%1024000,4)'m' thisitem
  413.                 ELSE lists.k.i=lists.k.i||RIGHT(bytes%1024,4)'k' thisitem
  414.               END
  415.           END
  416.       END
  417.     END
  418.     IF level>sysoplevel & items>24 THEN
  419.       DO
  420.         SAY items 'items,' dirs 'dirs,' lists.k.ROWS 'rows'
  421.         IF askcache='Y' THEN 
  422.         DO 
  423.           OPTIONS PROMPT  'FileCache' path'? (Ny) > '
  424.           PULL junk
  425.         END
  426.         ELSE junk='Y'
  427.         junk=UPPER(LEFT(junk,1))
  428.         IF junk='Y' THEN
  429.           DO
  430.             CALL MAKEDIR(bbspath'Cache')
  431.             cname=STRIP(RIGHT(COMPRESS(path,' ._-:/'),29))
  432.             x=OPEN(f,bbspath'Cache/'cname,'W')
  433.             IF x=0 THEN SAY 'Unable to open cache file' cname'!'
  434.             ELSE
  435.               DO
  436.                 CALL WRITECH(f,list)
  437.                 CALL CLOSE(f)
  438.               END
  439.             x=OPEN(f,bbspath'Cache/'cname'.','W')
  440.             IF x=0 THEN
  441.               DO
  442.                 SAY 'Unable to open cache file' cname'. !'CR
  443.                 CALL DELETE(bbspath'Cache/'cname)
  444.               END
  445.             ELSE
  446.               DO
  447.                 CALL WRITELN(f,path)
  448.                 DO i=1 TO lists.k.ROWS
  449.                   CALL WRITELN(f,TRIM(lists.k.i))
  450.                 END
  451.                 CALL CLOSE(f)
  452.                 SAY path 'has been cached.'
  453.               END
  454.           END
  455.       END
  456.   END
  457. IF selected~='' THEN
  458.   DO
  459.     SAY
  460.     w=WORDS(selected)
  461.     temp=pen3' 'w def'selected files.'
  462.     IF shosel~=1 THEN
  463.       DO
  464.         saytxt=pen3'selected:'def||CR
  465.         SAY saytxt
  466.         DO i=1 TO w
  467.           saytxt=WORD(selected,i)||CR
  468.           SAY saytxt
  469.         END
  470.       END
  471.     ELSE
  472.     DO
  473.       temp='Enter' pen3'SHOW S'def'elected to display'temp
  474.       SAY temp||CR
  475.     END
  476.     IF w>5 THEN shosel=1
  477.   END
  478. /* SAY CR */
  479. saytxt='current path ='pen3 path||def||CR
  480. SAY saytxt
  481. IF wannasee='Y' THEN 
  482.   DO 
  483.     saytxt=LEFT('-',75,'-')||CR
  484.     SAY saytxt
  485.   END
  486. DO i=1 TO lists.k.ROWS
  487.   saytxt=TRIM(lists.k.i)||CR
  488.   IF wannasee='Y' THEN SAY saytxt
  489.   IF (i+2)//(linesperpage-1)=0 & nonstop~=1 THEN
  490.     DO
  491.       CALL whodat()
  492.       /* OPTIONS PROMPT   ' - ['pen3'N'def']on-stop  ['pen3'Q'def']uit  ['pen3'RETURN'def']=Continue - ' */
  493.       junk='N'
  494.       IF LEFT(UPPER(junk),1)='Q' THEN LEAVE i
  495.       IF LEFT(UPPER(junk),1)='N' THEN nonstop=1
  496.     END
  497. END
  498. nonstop=0
  499. IF wannasee='Y' THEN
  500.   DO
  501.     saytxt=LEFT('-',75,'-')||CR
  502.     SAY saytxt
  503.   END
  504. CALL whodat()
  505. readflag=0
  506.  
  507. /* Simulate sysop typing all paths recursively!  DAS2 */
  508. DO getloop=1
  509.   pstring=showtime()'   Enter ''?'' for HELP > '
  510.   selection=''
  511.  
  512.   IF zzrecflag~=0 & zzpos=0 & zzcount<100 THEN
  513.   DO /* try to get back to device list prompt, ready for next dir */
  514.     zzcount=zzcount+1
  515.   END
  516.  
  517.   IF zzrecflag~=0 & zzcount~<100 THEN
  518.   DO zz3=1 to 1 /* check for end of current dir path & request new record */
  519.     zzstart=zzpos+1
  520.     If zzstart>LENGTH(zzpath) THEN
  521.       DO
  522.         zzrecflag=0
  523.         LEAVE zz3
  524.       END
  525.     zzpath2=''
  526.     DO zz4=zzstart to LENGTH(zzpath) /* find next 'dir' in current path */
  527.       zzchar=LEFT(zzpath,zz4)
  528.       zzchar=RIGHT(zzchar,1)
  529.       IF zzchar=':' THEN
  530.         DO 
  531.           zzpos=zz4
  532.           LEAVE zz4
  533.         END
  534.       IF zzchar='/' THEN
  535.         DO 
  536.           zzpos=zz4
  537.           LEAVE zz4
  538.         END
  539.       zzpath2=zzpath2''zzchar
  540.     END
  541.     selection=zzpath2
  542.     /* SAY 'split:'zzpath2 */
  543.   END
  544.  
  545.   IF zzrecflag=0 THEN 
  546.     DO /* get next dir name from newlist dirlist file */
  547.       DO zz2=1
  548.         line = READLN(f10)
  549.         IF EOF(f10) THEN 
  550.           DO
  551.             say 'End Of Dirlist File encountered'
  552.             selection='DONE'
  553.             LEAVE zz2
  554.           END
  555.         IF line='' THEN ITERATE zz2
  556.         IF UPPER(WORD(line,1))="DIRECTORY" THEN 
  557.           DO
  558.             zzpath=WORD(line,3)
  559.             zzpath=LEFT(zzpath,LENGTH(zzpath)-1)
  560.             zzpath=RIGHT(zzpath,LENGTH(zzpath)-1)
  561.             zzrecflag=1
  562.             zzpos=0
  563.             zzcount=0
  564.             IF RIGHT(zzpath,1)~=':' THEN zzpath=zzpath'/'
  565.             saytxt=LEFT('-',75,'-')||CR
  566.             SAY saytxt
  567.             SAY 'Entering new Path: 'zzpath
  568.             LEAVE zz2
  569.           END
  570.       END
  571.     END
  572. /*  ELSE
  573.     DO
  574.       OPTIONS PROMPT pstring
  575.       PARSE PULL selection
  576.     END */
  577.  
  578.  
  579.   /* PARSE selection */
  580.   IF selection='?' THEN
  581.     DO
  582.       CALL help()
  583.       OPTIONS PROMPT  'Press RETURN'
  584.       PULL junk
  585.       selection=';-)'
  586.       LEAVE getloop
  587.     END
  588.   IF LEFT(selection,1)='/' THEN selection=STRIP(SUBSTR(selection,2))
  589.   IF WORDS(selection)>1 THEN
  590.     DO
  591.       IF LEFT(UPPER(selection),6)='SHOW S' THEN
  592.         DO
  593.           shosel=''
  594.           selection=';-)'
  595.           LEAVE getloop
  596.         END
  597.       IF UPPER(selection)='SELECT ALL' THEN
  598.         DO
  599.           IF path='' | RIGHT(path,1)=':' | POS(UPPER(path),UPPER(devlist))>0 THEN
  600.             DO
  601.               SAY
  602.               saytxt=pen3'*** Archiving entire devices at one time is NOT allowed! ***'def||CR
  603.               SAY saytxt
  604.               SAY
  605.               ITERATE getloop
  606.             END
  607.           CALL selall(path xrecursive_size)
  608.           shosel=''
  609.           selection=':-)'
  610.           LEAVE getloop
  611.         END
  612.       ELSE IF UPPER(WORD(selection,1))='READ' THEN
  613.         DO
  614.           readflag=1
  615.           selection=STRIP(DELWORD(selection,1,1))
  616.         END
  617.       ELSE IF UPPER(WORD(selection,1))='CD' THEN selection=SUBSTR(selection,4)
  618.       ELSE IF UPPER(WORD(selection,1))='DIR' THEN selection=SUBSTR(selection,5)
  619.     END
  620.   i=FIND('DONE' UPPER(list),UPPER(selection))
  621.   IF i=0 THEN
  622.     DO
  623.       i=FIND('DONE' UPPER(list),UPPER(selection':'))
  624.       IF i=0 THEN
  625.         DO
  626.           IF UPPER(selection)='KINGFISHER' THEN
  627.             DO
  628.               IF EXISTS('rexx:KingFisher.rexx') THEN
  629.                 CALL KingFisher.rexx(name '. .' colorflag maxtime)
  630.               ELSE IF EXISTS(bbspath'rexxDoors/KingFisher.rexx') THEN
  631.                 DO
  632.                   curdir=PRAGMA('D',bbspath'rexxDoors')
  633.                   CALL KingFisher.rexx(name '. .' colorflag maxtime)
  634.                   curdir=PRAGMA('D',curdir)
  635.                 END
  636.               ELSE SAY 'KingFisher.rexx not found!'
  637.               ITERATE getloop
  638.             END
  639.           ELSE IF UPPER(selection)='Q' THEN selection='DONE'
  640.           ELSE ITERATE getloop
  641.         END
  642.       ELSE selection=selection':'
  643.     END
  644.   IF selection='' & path='' THEN ITERATE getloop
  645.   ELSE IF i>1 THEN selection=WORD(list,i-1)
  646.   IF readflag=1 THEN
  647.     DO
  648.       endtest=UPPER(RIGHT(selection,4))
  649.       IF FIND('.ARC .DMS .LZH .LHA .ZIP .ZOO',endtest)>0 THEN
  650.         DO
  651.           CALL Contents.rexx(path||selection)
  652.           IF EXISTS('RAM:CONTENTS') THEN CALL showtext('RAM: CONTENTS')
  653.         END
  654.       ELSE CALL showtext(path selection)
  655.       readflag=0
  656.       selection=';-)'
  657.     END
  658.   LEAVE getloop
  659. END
  660. RETURN selection
  661.  
  662.  
  663. selall: PROCEDURE EXPOSE selected pen3 def CR
  664. PARSE ARG dir xrecursive_size .
  665. IF FIND(exclude,UPPER(dir))>0 THEN RETURN
  666. saytxt='Sizing'pen3 dir||def||CR
  667. SAY saytxt
  668. IF RIGHT(dir,1)~='/' THEN dir=dir'/'
  669.  
  670. /* DAS */
  671.  
  672. sizefile='RAM:bbsCDsize'nodex
  673. ADDRESS COMMAND 'c:nl >'sizefile' 'dir' -Z -W -F'
  674. ADDRESS COMMAND 'c:WAIT 5'
  675. okflag=0
  676. fsize=0
  677. DO zloop=1 TO 10
  678.   zz=OPEN(f10,sizefile,'r')
  679.   IF zz=0 THEN
  680.   DO
  681.     SAY 'Waiting for Sizefile...'
  682.     ADDRESS COMMAND 'c:WAIT 5'
  683.     ITERATE zloop
  684.   END
  685.   ELSE
  686.     DO
  687.       okflag=1
  688.       LEAVE zloop
  689.     END
  690. END
  691. IF okflag~=1 THEN
  692. DO
  693.   SAY 'Sorry, too many files... SELECT ALL cancelled!'
  694.   ADDRESS COMMAND 'C:WAIT 2'
  695.   RETURN
  696. END
  697. zzsizetot=0
  698. zzfiletot=0
  699. zzdirtot=0
  700. zzpath=''
  701. DO zz2=1
  702.   line = READLN(f10)
  703.   IF EOF(f10) THEN LEAVE zz2
  704.   IF line='' THEN ITERATE
  705.   IF UPPER(WORD(line,2))='FILES' THEN 
  706.   DO
  707.     IF UPPER(WORD(line,1))='NO' THEN iterate zz2
  708.     SAY RIGHT(zzpath,32)', 'VALUE(WORD(line,1))' file(s), 'VALUE(WORD(line,13))' bytes'
  709.     zzsizetot=zzsizetot+VALUE(WORD(line,13))
  710.     zzfiletot=zzfiletot+VALUE(WORD(line,1))
  711.     zzdirtot=zzdirtot+1
  712.   END
  713. ELSE IF UPPER(WORD(line,1))="DIRECTORY" THEN zzpath=WORD(line,3)
  714. END
  715. CALL CLOSE(f10)
  716. saytxt=pen3'Total:'def' 'zzdirtot''pen3' dir(s), 'def''zzfiletot''pen3' file(s), 'def''zzsizetot''pen3' bytes'||def||CR
  717. SAY saytxt
  718. IF zzsizetot>xrecursive_size THEN
  719. DO
  720.   saytxt=pen3'*CANCELLED*'def' the maximum bytes allowed per 'pen3'SELECT ALL'def' is: 'pen3''xrecursive_size' bytes!!!'||def||CR
  721.   SAY saytxt
  722. END
  723. IF zzsizetot~>xrecursive_size THEN selected=selected' 'dir'*'
  724. ADDRESS COMMAND 'C:WAIT 4'
  725. RETURN
  726.  
  727.  
  728. showtext:
  729. PARSE ARG tpath' 'textfile 
  730. test=RIGHT(tpath,1)
  731. IF test~='' & test~=':' & test~='/' THEN tpath=tpath'/'
  732. x=OPEN(f,STRIP(tpath||textfile),'R')
  733. IF x=0 THEN RETURN
  734. test=READCH(f,64)
  735. mask=XRANGE(,'06'x)||XRANGE('0E'x,'1A'x)||XRANGE('1C'x,'1F'x)
  736. IF VERIFY(test,mask,'M')>0 THEN
  737.   DO
  738.     CALL CLOSE(f)
  739.     testloc=VERIFY(test,mask,'M')
  740.     saytxt='*** not an archive or a text file! ***'CR
  741.     SAY saytxt
  742.     saytxt='Character number' testloc 'is ASCII' C2D(SUBSTR(test,testloc,1))||CR
  743.     SAY saytxt
  744.     RETURN
  745.   END
  746. CALL SEEK(f,0,'B')
  747. SAY
  748. saytxt='-' tpath||textfile '-'CR
  749. SAY saytxt
  750. DO i=1 WHILE ~EOF(f)
  751.   saytxt=COMPRESS(READLN(f),CR||'0C'x)||CR
  752.   SAY saytxt
  753.   IF i//(linesperpage-1)=0 & nonstop~=1 THEN
  754.     DO
  755.       CALL whodat()
  756.       /* OPTIONS PROMPT  ' - ['pen3'N'def']on-stop  ['pen3'Q'def']uit  ['pen3'RETURN'def']=Continue - ' */
  757.       junk='N'
  758.       IF LEFT(UPPER(junk),1)='Q' THEN LEAVE i
  759.       IF LEFT(UPPER(junk),1)='N' THEN nonstop=1
  760.    /*   IF colorflag=1 | ADDRESS()~='BAUD'THEN
  761.         saytxt='1B'x'M'||LEFT('',60)||'1B'x'M'||CR
  762.         SAY saytxt */
  763.     END
  764. END
  765. CALL CLOSE(f)
  766. IF i//(linesperpage-1)>1 THEN
  767.   DO
  768.     OPTIONS PROMPT  ' - ['pen3'RETURN'def']=Continue - '
  769.     PULL junk
  770.   END
  771. nonstop=0
  772. RETURN
  773.  
  774.  
  775. whodat:
  776. IF ADDRESS()~='BAUD' THEN RETURN
  777. MSG RIGHT(' ',66-LENGTH(name)) '1B'x'M'||''||''||' 'name' level 'level' '||''
  778. RETURN
  779.  
  780.  
  781. help:
  782. SAY
  783. SAY
  784. saytxt=pen3'- HELP -'def
  785. SAY saytxt
  786. SAY
  787. saytxt='You can navigate through directory levels using the following commands.'CR
  788. SAY saytxt
  789. saytxt='Remember that the name must appear in the display before you can select it.'CR
  790. SAY saytxt
  791. saytxt='Filenames are displayed with their filesizes on the left, and directories'CR
  792. SAY saytxt
  793. saytxt='will have a' pen3'(dir)'def' on their left.'CR
  794. SAY saytxt
  795. SAY
  796. saytxt='To select an item from the displayed list, enter its name as displayed.'CR
  797. SAY saytxt
  798. saytxt='If the selected item is a' pen3'directory'def', its contents will be displayed.'CR
  799. SAY saytxt
  800. saytxt='If the selected item is a file, it is added to the ''selected'' list.'CR
  801. SAY saytxt
  802. saytxt='To remove a selected file from the list, enter its name again.'CR
  803. SAY saytxt
  804. SAY
  805. saytxt='To display the parent directory, enter an ''empty'' RETURN'CR
  806. SAY saytxt
  807. saytxt='To read a textfile or see the contents of an archive, enter' pen3'READ'def 'filename.'CR
  808. SAY saytxt
  809. saytxt='To select ALL items from the current display, including the contents of all'CR
  810. SAY saytxt
  811. saytxt='displayed directories and their sub-directories, enter 'pen3'SELECT ALL'def'.'CR
  812. SAY saytxt
  813. SAY
  814. IF EXISTS('rexx:KingFisher.rexx') | EXISTS(bbspath'rexxDoors/KingFisher.rexx') THEN
  815.   DO
  816.     saytxt='Enter 'pen3'KINGFISHER'def' to use the online search utility.'CR
  817.     SAY saytxt
  818.   END
  819. SAY
  820. saytxt='Enter'pen3 'DONE' def'to return to the BBS (and download any selected files)'CR
  821. SAY saytxt
  822. SAY
  823. RETURN
  824.  
  825.  
  826. showtime:
  827. mins=(maxtime-TIME('E'))%60
  828. secs=TRUNC((maxtime-TIME('E'))//60)
  829. IF secs<10 THEN secs='0'secs
  830. RETURN 'Time Remaining: 'mins':'secs
  831.  
  832.  
  833. BREAK_E:
  834. SAY
  835. saytxt=pen3'*** CONTROL-E BREAK ***'def||CR
  836. SAY saytxt
  837. i=999999
  838. RETURN ''
  839.  
  840.  
  841. BREAK_C:
  842. SAY CR
  843. EXIT ''
  844.  
  845. /* bbsExtDL.baud */
  846.